/**
 * 请求工具函数
 */
import { getToken } from './auth.js';

// 接口基础地址 - 统一使用本地开发环境地址
let BASE_URL = 'http://localhost:3000';

// 导出BASE_URL，以便在其他文件中使用
export { BASE_URL };

/**
 * 封装uni.request
 * @param {Object} options 请求选项
 * @returns {Promise} Promise对象
 */
const request = (options) => {
  return new Promise((resolve, reject) => {
    const token = getToken();
    
    // 构建完整URL
    let url = options.url;
    // 如果URL不是以http开头，则添加BASE_URL前缀
    if (!url.startsWith('http')) {
      url = BASE_URL + url;
    }
    
    console.log(`发送请求: ${options.method || 'GET'} ${url}`);
    
    // 请求参数
    const requestOptions = {
      url: url,
      method: options.method || 'GET',
      data: options.data,
      header: {
        'Content-Type': 'application/json',
        ...options.header
      },
      success: (res) => {
        // 记录响应结果，便于调试
        console.log(`${options.method || 'GET'} ${url} 响应:`, res.statusCode, res.data);
        
        // 请求成功
        if (res.statusCode === 200 || res.statusCode === 201) {
          // 特殊处理优惠券接口，直接检查success字段
          if (url.includes('/coupon/') && typeof res.data.success === 'boolean') {
            if (res.data.success) {
              resolve(res.data);
            } else {
              uni.showToast({
                title: res.data.message || '操作失败',
                icon: 'none'
              });
              reject(res.data);
            }
            return;
          }
          
          // 业务状态判断，这里假设后端返回的数据格式为 { code: 200, message: 'success', data: {} }
          if (res.data.code === 200) {
            resolve(res.data);
          } else if (res.data.code === 401) {
            // 未登录或Token过期
            uni.showToast({
              title: '登录已过期，请重新登录',
              icon: 'none'
            });
            // 清除登录状态并跳转到登录页
            uni.removeStorageSync('token');
            uni.removeStorageSync('userInfo');
            setTimeout(() => {
              uni.navigateTo({
                url: '/pages/login/login'
              });
            }, 1500);
            reject(res.data);
          } else {
            // 其他业务错误
            uni.showToast({
              title: res.data.message || '请求失败',
              icon: 'none'
            });
            reject(res.data);
          }
        } else if (res.statusCode === 404) {
          // API不存在
          console.error('请求的API不存在:', url);
          uni.showToast({
            title: '接口不存在，请检查API配置',
            icon: 'none',
            duration: 2000
          });
          reject(res);
        } else if (res.statusCode === 500) {
          // 服务器内部错误
          console.error('服务器内部错误:', res);
          uni.showToast({
            title: '服务器错误，请稍后重试',
            icon: 'none',
            duration: 2000
          });
          reject(res);
        } else {
          // 其他HTTP错误
          console.error(`HTTP错误 ${res.statusCode}:`, res);
          uni.showToast({
            title: `请求失败: ${res.statusCode}`,
            icon: 'none'
          });
          reject(res);
        }
      },
      fail: (err) => {
        // 记录请求失败信息
        console.error(`${options.method || 'GET'} ${url} 请求失败:`, err);
        
        // 请求失败
        uni.showToast({
          title: '网络错误，请检查网络连接',
          icon: 'none'
        });
        reject(err);
      }
    };
    
    // 如果有token，添加到请求头
    if (token) {
      requestOptions.header['Authorization'] = `Bearer ${token}`;
    }
    
    // 发送请求
    uni.request(requestOptions);
  });
};

// 导出请求方法
export default {
  /**
   * GET请求
   * @param {String} url 接口地址
   * @param {Object} params 请求参数
   * @param {Object} header 请求头
   * @returns {Promise} Promise对象
   */
  get(url, params = {}, header = {}) {
    return request({
      url,
      method: 'GET',
      data: params,
      header
    });
  },
  
  /**
   * POST请求
   * @param {String} url 接口地址
   * @param {Object} data 请求数据
   * @param {Object} header 请求头
   * @returns {Promise} Promise对象
   */
  post(url, data = {}, header = {}) {
    return request({
      url,
      method: 'POST',
      data,
      header
    });
  },
  
  /**
   * PUT请求
   * @param {String} url 接口地址
   * @param {Object} data 请求数据
   * @param {Object} header 请求头
   * @returns {Promise} Promise对象
   */
  put(url, data = {}, header = {}) {
    return request({
      url,
      method: 'PUT',
      data,
      header
    });
  },
  
  /**
   * DELETE请求
   * @param {String} url 接口地址
   * @param {Object} data 请求数据
   * @param {Object} header 请求头
   * @returns {Promise} Promise对象
   */
  delete(url, data = {}, header = {}) {
    return request({
      url,
      method: 'DELETE',
      data,
      header
    });
  }
}; 